GitHubのDependabotが作るプルリクエストで動くCI/CDで、デプロイさせたくない
GitHubには、Dependabotという便利な機能があります。 これは、利用しているライブラリに脆弱性が見つかったり、更新できる場合に、自動でプルリクエストを作ってるくれる機能です。
- Keeping your supply chain secure with Dependabot - GitHub Docs
- GitHubにDependabotを導入して依存ライブラリを自動アップデートする | DevelopersIO
とてもありがたい機能なのですが、同時にプルリクエスト(のためのブランチ)が作られて、同時にCI/CDが動いて、同時に同じAWS環境にデプロイされるのは嬉しくありません。 そこで、本記事では、「Dependabotで作られたプルリクエストの場合、デプロイさせない」を試してみます。 なお、CI/CDはCircleCIを使います。
おすすめの方
- GitHubのDependabotについて知りたい方
- CircleCIで特定のブランチ名のときにワークフローを変えたい方
Dependabotについて、簡単におさらい
プルリクエストの作成は、2つの種類があります。それぞれ、設定方法が異なります。
- Dependabot のセキュリティアップデート - GitHub Docs
- 脆弱性のあるライブラリを通知してくれる
- 脆弱性のあるライブラリを更新するプルリクエストを作成してくれる
- GitHub Dependabot のバージョンアップデートについて - GitHub Docs
- 最新のライブラリに更新するプルリクエストを作成してくれる
テスト用のGitHubリポジトリを準備する
適当なGitHubリポジトリを作成し、脆弱性のあるライブラリを利用するようにしてみます。
ここでは、Python(pip)を利用することにして、PyYAML
とrequests
の最初のバージョンを指定します。
requirements.txtを作成する
touch requirements.txt
古いバージョンのライブラリをrequirements.txtに記載する
PyYAML==3.01 requests==0.0.1
CircleCIのワークフローを作成する
mkdir .circleci touch .circleci/config.yml
CircleCIのconfigファイル
下記としてみました。
- lint_and_unittest
- すべてのブランチ・タグで動作する
- deploy
- dependabotブランチ以外で動作する
version: 2.1 executors: my_executor: docker: - image: circleci/python:3.9.9 working_directory: ~/work commands: lint_and_unittest: steps: - run: name: lint_and_unittest command: | echo lint and unittest deploy: steps: - run: name: deploy command: | echo deploy jobs: lint_and_unittest: executor: my_executor steps: - checkout - lint_and_unittest deploy: executor: my_executor steps: - checkout - deploy workflows: version: 2 my_workflow: jobs: - lint_and_unittest: filters: tags: only: /.*/ - deploy: filters: branches: ignore: /dependabot\/.+/ requires: - lint_and_unittest
ここでgit pushしておきます。
CircleCIの設定をする
CircleCIにアクセスし、プロジェクトを設定します。
初回のワークフローが動きました。
GitHubでDependabotの設定をする
セキュリティアラートとプルリクエスト作成を有効にする
「Settings」の「Code security and analysis」にアクセスし、下記を有効にします。
- Dependabot alerts
- Dependabot security updates
これによって、セキュリティアラートとセキュリティアラートに関する脆弱性のプルリクエストを作成してくれます。
セキュリティアラートの通知がくる
少し待つと、セキュリティアラートの通知がきました。
プルリクエストが作成される
そして、プルリクエストも作成されました。
CircleCIを確認する
CircleCIを確認すると、「lint_and_unittest」のみが実行されていました。 予定通りです。
プルリクエストをマージする
プルリクエストをマージすると、セキュリティアラートがCloseになりました。
requirements.txt
は下記に更新されました。
PyYAML==5.4 requests==2.20.0
おまけ:バージョンアップデートを試す
バージョンアップデートを設定する
セキュリティアラートに関係しないプルリクエスト作成として、バージョンアップデートがあります。これは、脆弱性に関係せず、最新のバージョンに更新するプルリクエストを作成してくれます。
これは、「Insights」の「Dependency graph」の「Dependabot」で設定ファイルを作成します。
もしくは、.github/dependabot.yml
を作成してcommit&pushします。
# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "pip" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily"
設定ファイルの中身は、下記を参考にしてください。
プルリクエストができた
少し待つと、最新バージョンへのプルリクエストが作られました。
CircleCIを確認する
予定通り、「lint_and_unittest」のみが実行されました。
さいごに
GitHubのDependabotが2種類あり、それぞれの役割や設定方法について理解できました。
便利な機能なので、どんどん活用していきたいです。
そして、同時にプルリクエスト(のためのブランチ)が作られてCI/CDが動く場合でも、ブランチ名によってワークフローを変更し、デプロイさせないようにしました。
もし、「デプロイして動作を確認したい」場合は、approve
と組み合わせて、人間が任意のタイミングでデプロイさせると良さそうです。
参考
- Keeping your supply chain secure with Dependabot - GitHub Docs
- Dependabot のセキュリティアップデート - GitHub Docs
- GitHub Dependabot のバージョンアップデートについて - GitHub Docs
- About the dependency graph - GitHub Docs
- Keeping your dependencies updated automatically with Dependabot version updates - GitHub Docs
- 依存関係の更新をカスタマイズする - GitHub Docs
- Configuration options for the dependabot.yml file - GitHub Docs
- CircleCI の設定 - CircleCI
- GitHubにDependabotを導入して依存ライブラリを自動アップデートする | DevelopersIO
- Check! GitHub Dependabot について知る